package com.eugenema.util;

import javafx.scene.control.TextArea;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import java.io.File;
import java.io.RandomAccessFile;

/**
 * 监听文件更改
 *
 * @author Eugenema
 * @date 2023/4/8 9:43
 */
public class FileListener extends FileAlterationListenerAdaptor {
    /** 记录文件的读取位置，以便确定下次读取的开始位置 */
    private long num = 0;
    /** 日志展示区域 */
    public static TextArea logArea;

    public FileListener(long num) {
        this.num = num;
    }

    /**
     * 文件创建执行
     */
    @Override
    public void onFileCreate(File file) {}

    /**
     * 文件创建修改
     */
    @Override
    public void onFileChange(File file) {
        try {
            logArea.appendText(readNewData(file));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 文件删除
     */
    @Override
    public void onFileDelete(File file) {
    }

    /**
     * 目录创建
     */
    @Override
    public void onDirectoryCreate(File directory) {
    }

    /**
     * 目录修改
     */
    @Override
    public void onDirectoryChange(File directory) {
    }

    /**
     * 目录删除
     */
    @Override
    public void onDirectoryDelete(File directory) {
    }

    @Override
    public void onStart(FileAlterationObserver observer) {
        super.onStart(observer);
    }

    @Override
    public void onStop(FileAlterationObserver observer) {
        super.onStop(observer);
    }
  
    
    /**
     * 读取文件最新内容
     *
     * 
     * @param file 读取到的文件
     *
     * @author Eugenema
     * @date 2023/4/8 10:45
     *
     * @return 读取到的内容
     **/
    public String readNewData(File file) throws Exception {
        StringBuilder newData = new StringBuilder();

        RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r");
        //将文件定位到偏移量所指位置，在该位置发生下一个读取或写入操作
        randomAccessFile.seek(num);

        byte[] bytes = new byte[(int) randomAccessFile.length()];
        randomAccessFile.read(bytes);
        String content = new String(bytes, "GBK");
        newData.append(new String(content.getBytes("GBK"), "GBK"));

        //重新计算偏移量，做下一次读取时的初始偏移量
        num = randomAccessFile.length();

        return newData.toString();
    }
}
